# coding=utf-8
from comment.modules import db
from datetime import datetime
#generate_password_hash本质上是通过哈希的算法进行加密，check_password_hash验证的过程
from werkzeug.security import generate_password_hash,check_password_hash

'''
如果想在数据库这种看到注释的话，把doc改成comment
doc这个属性在SQLchemy中是可以用的，在Flask_SQLchemy中是用comment的
'''

'''
技巧：如果想一次性编辑完doc变成comment的话：
按Edit（编辑）后，按Find（找到），按Replace（替换），第一个值写要替换的内容，第二个值写替换后的内容
'''

class User(db.Model):
    __tablename__ = 't_user'
    id = db.Column(db.BIGINT, primary_key=True, autoincrement=True)
    username = db.Column(db.String(64), comment='用户名')
    password = db.Column(db.String(128), comment='密码')
    payPassword = db.Column(db.String(128), comment='支付密码')
    payPwdStatus = db.Column(db.Integer, comment='支付密码验证', default=0)
    email = db.Column(db.String(100), comment='邮箱')
    emailStatus = db.Column(db.Integer, comment='邮箱验证', default=0)  # 1代码正常
    inviteId = db.Column(db.String(64), comment='邀请码')
    ip = db.Column(db.String(128), comment='ip')
    phone = db.Column(db.String(11), comment='手机号')
    onlock = db.Column(db.Integer, comment='用户状态',default=0)  # 0代码正常
    phoneStatus = db.Column(db.Integer, comment='手机验证', default=1)  # 1代码正常
    realName = db.Column(db.String(64), comment='真实姓名')
    remark = db.Column(db.String(500), comment='备注')
    realNameStatus = db.Column(db.Integer, comment='实名认证', default=0)  # 代表已认证
    nick_name = db.Column(db.String(200), comment='昵称')
    avatar = db.Column(db.String(128), comment='头像')
    idNum = db.Column(db.String(64), comment='身份证号码')
    sumFriends = db.Column(db.Integer, comment='邀请数量统计')
    invite_user_id = db.Column(db.Integer, comment='邀请的用户ID')
    role = db.Column(db.Integer, comment='是否管理员', default=0)  # 0普通用户 1管理员
    loginTime = db.Column(db.DateTime, default=datetime.now(), comment='登录时间')
    registerTime = db.Column(db.DateTime, default=datetime.now(), comment='用户注册的时间')

    '''set函数的作用就是加密，get函数是最后存在mysql里面的（明文，数据库存放的就是加密后的明文）'''
    #定义pwd的getter
    @property #定义了一个get函数
    def pwd(self):
        return self.password #加密之后的明文

    @pwd.setter
    #定义pwd的setter函数
    def pwd(self,x_password):
        '''
        根据明文的密码加密之后得到密文
        :param x_password: 密码的明文
        :return: 加密之后的密文
        '''
        self.password = generate_password_hash(x_password) #根据flask提供的算法加密

    #判断密码是否正确
    def check_password(self,x_password):
        '''
        验证密码是否正确
        :param x_password: 密码的明文
        :return:
        '''

        #最后返回的是True或者是False
        return check_password_hash(self.password,x_password) #传两个参数，明文，密文

    @property
    def pay_pwd(self):
        """
        支付密码
        """
        return self.payPassword

    @pay_pwd.setter
    #对传进去的密码进行加密
    def pay_pwd(self, p_password):
        self.payPassword = generate_password_hash(p_password)  # 根据flask提供的算法来加密

    #检查传进来的密码是什么
    def check_pay_password(self, p_password):
        return check_password_hash(self.payPassword, p_password)